/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Logica.Controladoras.Depositos;

import Logica.Core.Depositos.DepositoCanchada;
import Logica.Core.Depositos.DepositoLeña;
import Logica.Core.Depositos.Lote;
import Logica.Core.Depositos.LoteCanchada;
import Logica.Core.Depositos.LoteLeña;
import Logica.Core.Movimientos.Movimiento;
import Logica.Core.Producto.Producto;
import Persistencia.ControladoraPersistencia;
import Persistencia.JPAControllers.exceptions.NonexistentEntityException;
import Persistencia.JPAControllers.exceptions.PreexistingEntityException;
import java.util.LinkedList;
import java.util.List;

/**
 *
 * @author daniel
 */
public final class ControladoraLogicaDeposito {

    protected ControladoraPersistencia miControladora;
    private List<DepositoCanchada> misDepositosCanchada = new LinkedList<>();
    private List<DepositoLeña> misDepositosLeña = new LinkedList<>();
    private List<LoteCanchada> misLotesCanchada = new LinkedList<>();
    private List<LoteLeña> misLotesLeña = new LinkedList<>();

    public ControladoraLogicaDeposito(ControladoraPersistencia miControladora) {
        this.miControladora = miControladora;

        misDepositosCanchada = dameMisDepositosCanchada();
        misDepositosLeña = dameMisDepositosLeña();
    }

    // <editor-fold defaultstate="collapsed" desc="Clase DepositoCanchada">
    public void crearDepositoCanchada(double capacidad, List<Lote> misLotes, Movimiento miMovimiento) throws PreexistingEntityException, Exception {

        misDepositosCanchada = dameMisDepositosCanchada();
        int id = misDepositosCanchada.size();
        boolean encontro = false;
        DepositoCanchada miNuevoDepositoCanchada = new DepositoCanchada(id, capacidad, misLotes, miMovimiento);


        for (int i = 0; i < misDepositosCanchada.size() && !encontro; i++) {
            DepositoCanchada miDepositoCanchada = misDepositosCanchada.get(i);
            if (miDepositoCanchada.getId() == id) {
                encontro = true;
                throw new PreexistingEntityException("DepositoCanchada ya Existente.");
            }
        }

        misDepositosCanchada.add(miNuevoDepositoCanchada);
        miControladora.getMiPersistenciaDepositoCanchada().crearDepositoCanchada(miNuevoDepositoCanchada);
    }

    public void eliminarDepositoCanchada(int id) throws NonexistentEntityException, Exception {
        misDepositosCanchada = dameMisDepositosCanchada();
        boolean encontro = false;
        DepositoCanchada miDepositoCanchada = null;

        for (int i = 0; i < misDepositosCanchada.size() && !encontro; i++) {
            miDepositoCanchada = misDepositosCanchada.get(i);
            if (miDepositoCanchada.getId() == id) {
                encontro = true;
                misDepositosCanchada.remove(i);
            }
        }

        miControladora.getMiPersistenciaDepositoCanchada().eliminarDepositoCanchada(id);
    }

    public void modificarDepositoCanchada(int id, double capacidad, List<Lote> misLotes, Movimiento miMovimiento) throws NonexistentEntityException, Exception {

        boolean encontro = false;
        int pos = 0;

        misDepositosCanchada = dameMisDepositosCanchada();
        DepositoCanchada miDepositoCanchada = null;

        for (int i = 0; i < misDepositosCanchada.size() && !encontro; i++) {
            miDepositoCanchada = misDepositosCanchada.get(i);
            if (miDepositoCanchada.getId() == id) {
                encontro = true;
                pos = i;
            }
        }

        miDepositoCanchada.setMiMovimiento(miMovimiento);
        miDepositoCanchada.setMisLotes(misLotes);
        miDepositoCanchada.setCapacidad(capacidad);


        misDepositosCanchada.set(pos, miDepositoCanchada);
        miControladora.getMiPersistenciaDepositoCanchada().modificarDepositoCanchada(miDepositoCanchada);

    }

    public DepositoCanchada dameUnDepositoCanchada(int id) {
        misDepositosCanchada = dameMisDepositosCanchada();
        boolean encontro = false;
        DepositoCanchada miDepositoCanchada = null;

        for (int i = 0; i < misDepositosCanchada.size() && !encontro; i++) {
            miDepositoCanchada = misDepositosCanchada.get(i);
            if (miDepositoCanchada.getId() == id) {
                encontro = true;
            }
        }

        return miDepositoCanchada;
    }

    public List<DepositoCanchada> dameMisDepositosCanchada() {
        misDepositosCanchada = miControladora.getMiPersistenciaDepositoCanchada().dameMisDepositoCanchada();
        return misDepositosCanchada;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Clase DepositoLeña">
    public void crearDepositoLeña(double capacidad, List<Lote> misLotes, Movimiento miMovimiento) throws PreexistingEntityException, Exception {

        misDepositosLeña = dameMisDepositosLeña();
        int id = misDepositosLeña.size();
        boolean encontro = false;
        DepositoLeña miNuevoDepositoLeña = new DepositoLeña(id, capacidad, misLotes, miMovimiento);


        for (int i = 0; i < misDepositosLeña.size() && !encontro; i++) {
            DepositoLeña miDepositoLeña = misDepositosLeña.get(i);
            if (miDepositoLeña.getId() == id) {
                encontro = true;
                throw new PreexistingEntityException("DepositoLeña ya Existente.");
            }
        }

        misDepositosLeña.add(miNuevoDepositoLeña);
        miControladora.getMiPersistenciaDepositoLeña().crearDepositoLeña(miNuevoDepositoLeña);
    }

    public void eliminarDepositoLeña(int id) throws NonexistentEntityException, Exception {
        misDepositosLeña = dameMisDepositosLeña();
        boolean encontro = false;
        DepositoLeña miDepositoLeña = null;

        for (int i = 0; i < misDepositosLeña.size() && !encontro; i++) {
            miDepositoLeña = misDepositosLeña.get(i);
            if (miDepositoLeña.getId() == id) {
                encontro = true;
                misDepositosLeña.remove(i);
            }
        }

        miControladora.getMiPersistenciaDepositoLeña().eliminarDepositoLeña(id);
    }

    public void modificarDepositoLeña(int id, double capacidad, List<Lote> misLotes, Movimiento miMovimiento) throws NonexistentEntityException, Exception {

        boolean encontro = false;
        int pos = 0;

        misDepositosLeña = dameMisDepositosLeña();
        DepositoLeña miDepositoLeña = null;

        for (int i = 0; i < misDepositosLeña.size() && !encontro; i++) {
            miDepositoLeña = misDepositosLeña.get(i);
            if (miDepositoLeña.getId() == id) {
                encontro = true;
                pos = i;
            }
        }

        miDepositoLeña.setMiMovimiento(miMovimiento);
        miDepositoLeña.setMisLotes(misLotes);
        miDepositoLeña.setCapacidad(capacidad);


        misDepositosLeña.set(pos, miDepositoLeña);
        miControladora.getMiPersistenciaDepositoLeña().modificarDepositoLeña(miDepositoLeña);

    }

    public DepositoLeña dameUnDepositoLeña(int id) {
        misDepositosLeña = dameMisDepositosLeña();
        boolean encontro = false;
        DepositoLeña miDepositoLeña = null;

        for (int i = 0; i < misDepositosLeña.size() && !encontro; i++) {
            miDepositoLeña = misDepositosLeña.get(i);
            if (miDepositoLeña.getId() == id) {
                encontro = true;
            }
        }

        return miDepositoLeña;
    }

    public List<DepositoLeña> dameMisDepositosLeña() {
        misDepositosLeña = miControladora.getMiPersistenciaDepositoLeña().dameMisDepositoLeña();
        return misDepositosLeña;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Clase LoteCanchada">
    public void crearLoteCanchada(DepositoCanchada miDeposito, Producto miProducto) throws PreexistingEntityException, Exception {

        misLotesCanchada = dameMisLotesCanchada();
        int id = misLotesCanchada.size();
        boolean encontro = false;
        LoteCanchada miNuevoLoteCanchada = new LoteCanchada(id, miDeposito, miProducto);


        for (int i = 0; i < misLotesCanchada.size() && !encontro; i++) {
            LoteCanchada miLoteCanchada = misLotesCanchada.get(i);
            if (miLoteCanchada.getNumero()== id) {
                encontro = true;
                throw new PreexistingEntityException("LoteCanchada ya Existente.");
            }
        }

        misLotesCanchada.add(miNuevoLoteCanchada);
        miControladora.getMiPersistenciaLoteCanchada().crearLoteCanchada(miNuevoLoteCanchada);
    }

    public void eliminarLoteCanchada(int id) throws NonexistentEntityException, Exception {
        misLotesCanchada = dameMisLotesCanchada();
        boolean encontro = false;
        LoteCanchada miLoteCanchada = null;

        for (int i = 0; i < misLotesCanchada.size() && !encontro; i++) {
            miLoteCanchada = misLotesCanchada.get(i);
            if (miLoteCanchada.getNumero() == id) {
                encontro = true;
                misLotesCanchada.remove(i);
            }
        }

        miControladora.getMiPersistenciaLoteCanchada().eliminarLoteCanchada(id);
    }

    public void modificarLoteCanchada(int numero, DepositoCanchada miDeposito, Producto miProducto) throws NonexistentEntityException, Exception {

        boolean encontro = false;
        int pos = 0;

        misLotesCanchada = dameMisLotesCanchada();
        LoteCanchada miLoteCanchada = null;

        for (int i = 0; i < misLotesCanchada.size() && !encontro; i++) {
            miLoteCanchada = misLotesCanchada.get(i);
            if (miLoteCanchada.getNumero() == numero) {
                encontro = true;
                pos = i;
            }
        }

        miLoteCanchada.setMiDeposito(miDeposito);
        miLoteCanchada.setMiProducto(miProducto);


        misLotesCanchada.set(pos, miLoteCanchada);
        miControladora.getMiPersistenciaLoteCanchada().modificarLoteCanchada(miLoteCanchada);

    }

    public LoteCanchada dameUnLoteCanchada(int id) {
        misLotesCanchada = dameMisLotesCanchada();
        boolean encontro = false;
        LoteCanchada miLoteCanchada = null;

        for (int i = 0; i < misLotesCanchada.size() && !encontro; i++) {
            miLoteCanchada = misLotesCanchada.get(i);
            if (miLoteCanchada.getNumero()== id) {
                encontro = true;
            }
        }

        return miLoteCanchada;
    }

    public List<LoteCanchada> dameMisLotesCanchada() {
        misLotesCanchada = miControladora.getMiPersistenciaLoteCanchada().dameMisLoteCanchada();
        return misLotesCanchada;
    }
    // </editor-fold>

     // <editor-fold defaultstate="collapsed" desc="Clase LoteLeña">
    public void crearLoteLeña(DepositoLeña miDeposito, Producto miProducto) throws PreexistingEntityException, Exception {

        misLotesLeña = dameMisLotesLeña();
        int id = misLotesLeña.size();
        boolean encontro = false;
        LoteLeña miNuevoLoteLeña = new LoteLeña(id, miDeposito, miProducto);


        for (int i = 0; i < misLotesLeña.size() && !encontro; i++) {
            LoteLeña miLoteLeña = misLotesLeña.get(i);
            if (miLoteLeña.getNumero()== id) {
                encontro = true;
                throw new PreexistingEntityException("LoteLeña ya Existente.");
            }
        }

        misLotesLeña.add(miNuevoLoteLeña);
        miControladora.getMiPersistenciaLoteLeña().crearLoteLeña(miNuevoLoteLeña);
    }

    public void eliminarLoteLeña(int id) throws NonexistentEntityException, Exception {
        misLotesLeña = dameMisLotesLeña();
        boolean encontro = false;
        LoteLeña miLoteLeña = null;

        for (int i = 0; i < misLotesLeña.size() && !encontro; i++) {
            miLoteLeña = misLotesLeña.get(i);
            if (miLoteLeña.getNumero() == id) {
                encontro = true;
                misLotesLeña.remove(i);
            }
        }

        miControladora.getMiPersistenciaLoteLeña().eliminarLoteLeña(id);
    }

    public void modificarLoteLeña(int numero, DepositoLeña miDeposito, Producto miProducto) throws NonexistentEntityException, Exception {

        boolean encontro = false;
        int pos = 0;

        misLotesLeña = dameMisLotesLeña();
        LoteLeña miLoteLeña = null;

        for (int i = 0; i < misLotesLeña.size() && !encontro; i++) {
            miLoteLeña = misLotesLeña.get(i);
            if (miLoteLeña.getNumero() == numero) {
                encontro = true;
                pos = i;
            }
        }

        miLoteLeña.setMiDeposito(miDeposito);
        miLoteLeña.setMiProducto(miProducto);


        misLotesLeña.set(pos, miLoteLeña);
        miControladora.getMiPersistenciaLoteLeña().modificarLoteLeña(miLoteLeña);

    }

    public LoteLeña dameUnLoteLeña(int id) {
        misLotesLeña = dameMisLotesLeña();
        boolean encontro = false;
        LoteLeña miLoteLeña = null;

        for (int i = 0; i < misLotesLeña.size() && !encontro; i++) {
            miLoteLeña = misLotesLeña.get(i);
            if (miLoteLeña.getNumero()== id) {
                encontro = true;
            }
        }

        return miLoteLeña;
    }

    public List<LoteLeña> dameMisLotesLeña() {
        misLotesLeña = miControladora.getMiPersistenciaLoteLeña().dameMisLoteLeña();
        return misLotesLeña;
    }
    // </editor-fold>

}
